home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / bin / trigrp / vec4.h < prev   
C/C++ Source or Header  |  1992-08-31  |  3KB  |  120 lines

  1. #include <math.h>
  2. typedef    double  point4[4];
  3. typedef    double  plane4[4];
  4. typedef    double  matrix4[4][4];
  5.  
  6. #define    ABS(aaa)    (( (aaa) > 0) ? (aaa) : -(aaa))
  7. #define    VDOT3(v0,v1)    (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2])
  8. #define    INPRO31(v0,v1)    (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] - v0[3]*v1[3])
  9. #define    INPRO4(v0,v1)    (v0[0]*v1[0] + v0[1]*v1[1] + v0[2]*v1[2] + v0[3]*v1[3])
  10.  
  11. #define MAGNITUDE3(v0)    (sqrt (VDOT3(v0, v0)))
  12. #define MAGNITUDE31(v0)    (sqrt (ABS (INPRO31(v0, v0))))
  13. #define MAGNITUDE4(v0)    (sqrt (INPRO4(v0, v0)))
  14.  
  15. #define PROJECT4(v0)    \
  16.     {float d = v0[3];    \
  17.     if (d)    {    \
  18.     d = 1.0/d;    \
  19.     v0[0] = v0[0] * d;    \
  20.     v0[1] = v0[1] * d;    \
  21.     v0[2] = v0[2] * d;    \
  22.     v0[3] = 1.0; }}    
  23.  
  24. #define NORMALIZE3(v0)    \
  25.     {double xxx;        \
  26.     if (xxx = MAGNITUDE3(v0))    \
  27.     {v0[0] /= xxx;  v0[1] /= xxx;  v0[2] /= xxx; }  }
  28.  
  29. #define     NORMALIZE31(v)    \
  30.      {double tmp = INPRO31(v,v);        \
  31.     if (tmp) { tmp = 1.0/sqrt(ABS(tmp)); v[0] *= tmp; v[1] *= tmp; v[2] *= tmp; v[3] *= tmp; }}
  32.  
  33. #define VPRINT3(name,v)        printf("name\t%f %f %f\n",v[0],v[1],v[2]);
  34. #define VPRINT4(name,v)        printf("name\t%f %f %f %f %f\n",v[0],v[1],v[2],v[3]);
  35. #define VADD3(v0,v1,v2)    \
  36.     {v2[0] = v0[0] + v1[0]; \
  37.     v2[1] = v0[1] + v1[1]; \
  38.     v2[2] = v0[2] + v1[2]; \
  39.     v2[3] = 1.0; }
  40.     
  41. #define VADD4(v0,v1,v2)    \
  42.     {v2[0] = v0[0] + v1[0]; \
  43.     v2[1] = v0[1] + v1[1]; \
  44.     v2[2] = v0[2] + v1[2]; \
  45.     v2[3] = v0[3] + v1[3]; }
  46.  
  47. #define VSUB3(v0,v1,v2)    \
  48.     {v2[0] = v0[0] - v1[0]; \
  49.     v2[1] = v0[1] - v1[1]; \
  50.     v2[2] = v0[2] - v1[2]; \
  51.     v2[3] = 1.0;}
  52.     
  53. #define VSUB4(v0,v1,v2)    \
  54.     {v2[0] = v0[0] - v1[0]; \
  55.     v2[1] = v0[1] - v1[1]; \
  56.     v2[2] = v0[2] - v1[2]; \
  57.     v2[3] = v0[3] - v1[3];}
  58.  
  59. #define MIDPOINT4(v0,v1,v2)    \
  60.     {v2[0] = (v0[0] + v1[0])/2.0; \
  61.     v2[1] = (v0[1] + v1[1])/2.0; \
  62.     v2[2] = (v0[2] + v1[2])/2.0; \
  63.     v2[3] = (v0[3] + v1[3])/2.0; }
  64.  
  65. #define VISZERO4(v)    (v[0] == 0 && v[1] == 0 && v[2] == 0 && v[3] == 0)
  66.  
  67. #define MIDPOINT31(v0,v1,v2)    \
  68.     {float m00, m11, a,v3[4];    \
  69.     VSUB4(v0, v1, v3);    \
  70.     if (VISZERO4(v3))    \
  71.         VCOPY4(v0,v2)    \
  72.     else    {        \
  73.     m00 =  INPRO31(v0,v3);    \
  74.     m11 = INPRO31(v1,v3);    \
  75.     v2[0] = m11*v0[0] - m00*v1[0]; \
  76.     v2[1] = m11*v0[1] - m00*v1[1]; \
  77.     v2[2] = m11*v0[2] - m00*v1[2]; \
  78.     v2[3] = m11*v0[3] - m00*v1[3]; }}
  79.  
  80. #define XPRO3(v0,v1,v2)    \
  81.     {v2[0] = v0[1]*v1[2] - v0[2]*v1[1];    \
  82.     v2[1] = v0[2]*v1[0] - v0[0]*v1[2];    \
  83.     v2[2] = v0[0]*v1[1] - v0[1]*v1[0];  }
  84.  
  85. #define VSCALE3(v0, s, v1)    \
  86.     {v1[0] = s * v0[0];    \
  87.     v1[1] = s * v0[1];    \
  88.     v1[2] = s * v0[2];    }
  89.  
  90. #define VSCALE4(v0, s, v1)    \
  91.     {v1[0] = s * v0[0];    \
  92.     v1[1] = s * v0[1];    \
  93.     v1[2] = s * v0[2];    \
  94.     v1[3] = s * v0[3];    }
  95.  
  96. #define VCOPY3(v0, v1)    \
  97.     {v1[0] = v0[0];    \
  98.     v1[1] = v0[1];    \
  99.     v1[2] = v0[2];    }
  100.  
  101. #define VCOPY4(v0, v1)    \
  102.     {v1[0] = v0[0];    \
  103.     v1[1] = v0[1];    \
  104.     v1[2] = v0[2];    \
  105.     v1[3] = v0[3];}
  106.  
  107. #define VZERO3(v0)    \
  108.     {v0[0] = 0;    \
  109.     v0[1] = 0;    \
  110.     v0[2] = 0;    \
  111.     v0[3] = 1.0; }
  112.  
  113. #define COPYMAT4(m1, m2)    \
  114.     bcopy(m1, m2, (sizeof(double) * 16));
  115.  
  116.  
  117.  
  118.  
  119.  
  120.